
class Observe {
    constructor(data){
       // Object.defineProperty 只能存在的属性( 新增和删除的)
        this.walk(data)
        // 如果通过递归给数组元素响应比较好性能
        if(Array.isArray(data)){
            // 这里我们重新数组的方法7个方法
            this.observeArray(data)
        }else{
            this.walk(data)
        }
       
    }
    // 循环对象 对属性依次劫持
    walk(data){
        Object.keys(data).forEach(key=>defineReactive(data,key,data[key]))
    }
    // observe 观察数组元素是对象,就把对象变响应式的
    observeArray(data){
        data.forEach(item=>observe(item))
    }
}

export function defineReactive(target,key,value){ // 闭包 属性劫持
    // 如果value是对象需要递归劫持
    observe(value)
    Object.defineProperty(target,key,{
        get(){
          return  value
        },
        set(newValue){
        if(newValue==value)return
        observe(value)
        value = newValue//
        }
    })
}


// observe 观察着
export function observe(data){
    // 对这个对象进行劫持
    if(typeof data !== 'object' || data === null){
        return  // 只对对象进行劫持
    }
    // 如果一个对象被劫持过了。那就不需要再被劫持
    // (判断一个对象是否被劫持过,可以添加一个实例，用实例来判断是否被劫持过)
    return new Observe(data)
}